<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="../style/journal.css" type="text/css" />
<style type="text/css"><!--
.googleadsense {
	margin: 2px;
	padding: 0px;
//--></style><script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-65008-1";
urchinTracker();
</script><title>[DRAFT]如何处理 Perl 中的时间</title>
</head>
<body>
<a href="index.html">Journal</a>(2005) | <a href="../blog/"><b>Blog</b></a>(2006) | <a href="http://www.fayland.org/cgi-bin/random_link.pl">RandomLink</a> | <a href="AboutFayland.html">WhoAmI</a> | <a href="LiveBookmark.html">LiveBookmark</a> | <a href="http://www.fayland.org/">HomePage</a>
<p><&lt;Previous: <a href="051213.html">joy in Perl</a>&nbsp;&nbsp;>>Next: <a href="CatalystAdventCalendar_CN.html">Catalyst Advent Calendar 中文版</a></p>
<h1>[DRAFT]如何处理 Perl 中的时间</h1>
<div class='content'>
<p>Category: <a href='Basic.html'>Basic</a> &nbsp; Keywords: <b>date time calendar epoch timezone</b></p>如果你能比较流畅地阅读英文，可以试着看：<br /><a href="http://www.perl.com/lpt/a/2003/03/13/datetime.html">http://www.perl.com/lpt/a/2003/03/13/datetime.html</a><p />我只翻译了一些我认为应该知道的内容。<h3>基础概念</h3><ul><li>UTC/GMT/Z<br />UTC 是 Coordinated Universal Time 的缩写<br />GMT 是 Greenwich Mean Time 的缩写。格林威治时间。<br />Z 是美国军方所用的。所以你如果在时间里看到里面有个 Z 字，比如 2005-12-13T14:59:37Z 就说明它是个 GMT 时间。<br />Perl 中的 gmtime 就是属于这方面的。<br /><li>与之相对的是 Local Time, Perl 中对应的是 localtime<br />为什么有 gmtime 和 localtime 这是因为地球是圆的和还有太阳的关系。在英国中午十二点在中国并不是中午十二点。<br />这就涉及到另外一个概念。Time Zone 时区。更复杂的是时区的加加减减不是固定的。<br />其中还涉及到 Daylight Saving Time，在 Daylight Saving Time 的影响下某地相对英国可能是相差五个小时，而没有这个影响的话只有四个小时。<br />当然我们不用管这个东西，我地理也学得不是很好。学得好的同学已经把这个搞定了，我直接拿来用就是了。（不要怪我不好学，实在是没兴趣再去学习一次地理了。）<br /><li>上面的是现实中的问题，接下来是电脑的问题了。英文中涉及到的 epoch 的意思经常是从某一时间开始算起的秒数。<br />比如 Unix 系统下的 epoch 就是从 1970 年一月一日的 GMT 时间开始算秒。但是并不是所有的系统都是从这个时间开始算起的。<br />Perl 中获取这个 epoch 我们用 time 函数就可以了。<br />另外我们还有个电脑问题。因为现在我们大部分人都在用 32 位的处理器，把 32 位的最大值做为秒，然后换算一下也只有 136 年。所以现在的大部分 Unix 系统都只能处理 1902-2038 这个时间段。<br />这就是所谓的 epoch 问题。有些模块是有这个问题的（比如 <a href="http://search.cpan.org/perldoc?Class::Date">Class::Date</a> ），而有些模块是没这个问题的（比如 <a href="http://search.cpan.org/perldoc?Date::Simple">Date::Simple</a> ）。如果你发现某个模块处理不了这个时间段外的年，那就说明是有这个问题的。写代码的时候要小心一点。<br />因为 epoch 有这些问题，所以一般而言最好不要用这个来保存你的时间。（除非不得已）<br /><li>日历。一般我们都使用阳历，即所谓的 The Gregorian Calendar。而作为中国人还有阴历，The Chinese Calendar。还有希伯来历等等。<br /></ul></div>
<p><&lt;Previous: <a href="051213.html">joy in Perl</a>&nbsp;&nbsp;>>Next: <a href="CatalystAdventCalendar_CN.html">Catalyst Advent Calendar 中文版</a></p>
<p><strong>Options:</strong> <a href='http://del.icio.us/post?title=%5BDRAFT%5D%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%20Perl%20%E4%B8%AD%E7%9A%84%E6%97%B6%E9%97%B4&url=http://www.fayland.org/journal/DateTime.html'>+Del.icio.us</a></p>
<strong>Related items</strong>
<ul><li><a href='Class_Date.html'>Class::Date 的两个常见用途</a> < <span class='digit'>2005-06-01 15:02:47</span> ></li><li><a href='Date_Holidays_CN.html'>检测中国的假期模块</a> < <span class='digit'>2005-12-20 15:00:51</span> ></li><li><a href='TimePassed.html'>从我出生来过去多久了？</a> < <span class='digit'>2004-12-10 17:45:07</span> ></li><li><a href='CatalystAdventCalendar_CN.html'>Catalyst Advent Calendar 中文版</a> < <span class='digit'>2005-12-15 23:28:40</span> ></li></ul>
Created on <span class="digit">2005-12-13 22:59:37</span>, Last modified on <span class="digit">2005-12-13 23:05:27</span><br />
Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href='http://catalyst.perl.org'>Catalyst</a> 5.62.
</body>
</html>